From e9b916ec23f5dd64d187bace1532eeebb95a1d51 Mon Sep 17 00:00:00 2001 From: Keir Fraser Date: Thu, 28 Feb 2008 10:46:27 +0000 Subject: [PATCH] kexec: Add machine_kexec_get() Introduce machine_kexec_get to allow architecture-specific handling of the xen region. x86_64 is currently different to x86_32 and ia64. Signed-off-by: Simon Horman --- xen/arch/ia64/xen/machine_kexec.c | 15 +++++++++++++ xen/arch/powerpc/machine_kexec.c | 6 ++++++ xen/arch/x86/machine_kexec.c | 10 +++++++++ xen/arch/x86/x86_32/Makefile | 1 + xen/arch/x86/x86_32/machine_kexec.c | 33 +++++++++++++++++++++++++++++ xen/arch/x86/x86_64/Makefile | 1 + xen/arch/x86/x86_64/machine_kexec.c | 32 ++++++++++++++++++++++++++++ xen/common/kexec.c | 18 ++++------------ xen/include/xen/kexec.h | 1 + 9 files changed, 103 insertions(+), 14 deletions(-) create mode 100644 xen/arch/x86/x86_32/machine_kexec.c create mode 100644 xen/arch/x86/x86_64/machine_kexec.c diff --git a/xen/arch/ia64/xen/machine_kexec.c b/xen/arch/ia64/xen/machine_kexec.c index b9c78fd9ed..58590b7c39 100644 --- a/xen/arch/ia64/xen/machine_kexec.c +++ b/xen/arch/ia64/xen/machine_kexec.c @@ -165,6 +165,21 @@ void machine_reboot_kexec(xen_kexec_image_t *image) machine_kexec(image); } +static int machine_kexec_get_xen(xen_kexec_range_t *range) +{ + range->start = virt_to_maddr(_start); + range->size = (unsigned long)xenheap_phys_end - + (unsigned long)range->start; + return 0; +} + +int machine_kexec_get(xen_kexec_range_t *range) +{ + if (range->range != KEXEC_RANGE_MA_XEN) + return -EINVAL; + return machine_kexec_get_xen(range); +} + /* * Local variables: * mode: C diff --git a/xen/arch/powerpc/machine_kexec.c b/xen/arch/powerpc/machine_kexec.c index 51ddd75890..f16af71085 100644 --- a/xen/arch/powerpc/machine_kexec.c +++ b/xen/arch/powerpc/machine_kexec.c @@ -24,6 +24,12 @@ void machine_kexec(xen_kexec_image_t *image) printk("STUB: " __FILE__ ": %s: not implemented\n", __FUNCTION__); } +int machine_kexec_get(xen_kexec_image_t *image) +{ + printk("STUB: " __FILE__ ": %s: not implemented\n", __FUNCTION__); + return -1; +} + /* * Local variables: * mode: C diff --git a/xen/arch/x86/machine_kexec.c b/xen/arch/x86/machine_kexec.c index 5d693a2938..4c2ccd8080 100644 --- a/xen/arch/x86/machine_kexec.c +++ b/xen/arch/x86/machine_kexec.c @@ -24,6 +24,9 @@ typedef void (*relocate_new_kernel_t)( unsigned long *page_list, unsigned long start_address); +extern int machine_kexec_get_xen(xen_kexec_range_t *range); + + int machine_kexec_load(int type, int slot, xen_kexec_image_t *image) { unsigned long prev_ma = 0; @@ -135,6 +138,13 @@ void machine_kexec(xen_kexec_image_t *image) } } +int machine_kexec_get(xen_kexec_range_t *range) +{ + if (range->range != KEXEC_RANGE_MA_XEN) + return -EINVAL; + return machine_kexec_get_xen(range); +} + /* * Local variables: * mode: C diff --git a/xen/arch/x86/x86_32/Makefile b/xen/arch/x86/x86_32/Makefile index 0154c366ba..619b1b1959 100644 --- a/xen/arch/x86/x86_32/Makefile +++ b/xen/arch/x86/x86_32/Makefile @@ -4,6 +4,7 @@ obj-y += gpr_switch.o obj-y += mm.o obj-y += seg_fixup.o obj-y += traps.o +obj-y += machine_kexec.o obj-$(crash_debug) += gdbstub.o diff --git a/xen/arch/x86/x86_32/machine_kexec.c b/xen/arch/x86/x86_32/machine_kexec.c new file mode 100644 index 0000000000..b22ddbf5dc --- /dev/null +++ b/xen/arch/x86/x86_32/machine_kexec.c @@ -0,0 +1,33 @@ +/****************************************************************************** + * machine_kexec.c + * + * Xen port written by: + * - Simon 'Horms' Horman + * - Magnus Damm + */ + +#ifndef CONFIG_COMPAT + +#include +#include +#include +#include + +int machine_kexec_get_xen(xen_kexec_range_t *range) +{ + range->start = virt_to_maddr(_start); + range->size = (unsigned long)xenheap_phys_end - + (unsigned long)range->start; + return 0; +} +#endif + +/* + * Local variables: + * mode: C + * c-set-style: "BSD" + * c-basic-offset: 4 + * tab-width: 4 + * indent-tabs-mode: nil + * End: + */ diff --git a/xen/arch/x86/x86_64/Makefile b/xen/arch/x86/x86_64/Makefile index b721970172..d231427c8e 100644 --- a/xen/arch/x86/x86_64/Makefile +++ b/xen/arch/x86/x86_64/Makefile @@ -4,6 +4,7 @@ obj-y += entry.o obj-y += gpr_switch.o obj-y += mm.o obj-y += traps.o +obj-y += machine_kexec.o obj-$(crash_debug) += gdbstub.o obj-$(CONFIG_COMPAT) += compat.o diff --git a/xen/arch/x86/x86_64/machine_kexec.c b/xen/arch/x86/x86_64/machine_kexec.c new file mode 100644 index 0000000000..96413cb828 --- /dev/null +++ b/xen/arch/x86/x86_64/machine_kexec.c @@ -0,0 +1,32 @@ +/****************************************************************************** + * machine_kexec.c + * + * Xen port written by: + * - Simon 'Horms' Horman + * - Magnus Damm + */ + +#ifndef CONFIG_COMPAT + +#include +#include +#include + +int machine_kexec_get_xen(xen_kexec_range_t *range) +{ + range->start = xenheap_phys_start; + range->size = (unsigned long)xenheap_phys_end - + (unsigned long)range->start; + return 0; +} +#endif + +/* + * Local variables: + * mode: C + * c-set-style: "BSD" + * c-basic-offset: 4 + * tab-width: 4 + * indent-tabs-mode: nil + * End: + */ diff --git a/xen/common/kexec.c b/xen/common/kexec.c index f1aa784e93..fcaebbbebc 100644 --- a/xen/common/kexec.c +++ b/xen/common/kexec.c @@ -20,6 +20,7 @@ #include #include #include +#include #include #include @@ -164,17 +165,6 @@ static int kexec_get_reserve(xen_kexec_range_t *range) return 0; } -static int kexec_get_xen(xen_kexec_range_t *range) -{ -#ifdef CONFIG_X86_64 - range->start = xenheap_phys_start; -#else - range->start = virt_to_maddr(_start); -#endif - range->size = (unsigned long)xenheap_phys_end - (unsigned long)range->start; - return 0; -} - static int kexec_get_cpu(xen_kexec_range_t *range) { int nr = range->nr; @@ -228,12 +218,12 @@ static int kexec_get_range_internal(xen_kexec_range_t *range) case KEXEC_RANGE_MA_CRASH: ret = kexec_get_reserve(range); break; - case KEXEC_RANGE_MA_XEN: - ret = kexec_get_xen(range); - break; case KEXEC_RANGE_MA_CPU: ret = kexec_get_cpu(range); break; + default: + ret = machine_kexec_get(range); + break; } return ret; diff --git a/xen/include/xen/kexec.h b/xen/include/xen/kexec.h index 1e04f9733c..9dc3dacac0 100644 --- a/xen/include/xen/kexec.h +++ b/xen/include/xen/kexec.h @@ -31,6 +31,7 @@ void kexec_disable_iosapic(void); void kexec_crash_save_cpu(void); crash_xen_info_t *kexec_crash_save_info(void); void machine_crash_shutdown(void); +int machine_kexec_get(xen_kexec_range_t *range); #endif /* __XEN_KEXEC_H__ */ -- 2.30.2